package sessionBean;

import java.util.ArrayList;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import entityBean.Attrazione;
import entityBean.Hotel;
import entityBean.Operatore;
import entityBean.Volo;

/**
 * Session Bean implementation class InfoOpCtrl
 */
@Stateless(name="InfoOpCtrl")
@Remote(InfoOpCtrlRemote.class)
public class InfoOpCtrl implements InfoOpCtrlRemote {

	@PersistenceContext(name="cvproject")
	private EntityManager manager;
	
    /**
     * Default constructor. 
     */
    public InfoOpCtrl() {
        // TODO Auto-generated constructor stub
    }
    
    private Operatore getOperatore(String codice) {

		//Prelevo le informazioni dell'operatore

		Operatore o = manager.find(Operatore.class, codice);

		//Prelevo tutte le BTP legate a quell'operatore

		String s = "FROM hotel h WHERE h.codiceop=:op";
		Query q = manager.createQuery(s);
		q.setParameter("op", codice);

		ArrayList<Hotel> hotels = new ArrayList<Hotel>(q.getResultList());

		s = "FROM volo v WHERE v.codoperatore=:op";
		q = manager.createQuery(s);
		q.setParameter("op", codice);

		ArrayList<Volo> voli = new ArrayList<Volo>(q.getResultList());

		s = "FROM attrazione a WHERE a.codiceop=:op";
		q = manager.createQuery(s);
		q.setParameter("op", codice);

		ArrayList<Attrazione> att = new ArrayList<Attrazione>(q.getResultList());

		o.setHotel(hotels);
		o.setVoli(voli);
		o.setAtt(att);
		
		return o;

	}

	@Override
	public Operatore getInfo(String codice) {
		
		return manager.find(Operatore.class, codice);
		
	}

	@Override
	public Operatore modifica(String codVecchio, String codNuovo, String password) {
		
		//Se cambio solo la password ---> update del solo op
		if(codVecchio.equals(codNuovo)) {
			
			String s = "UPDATE operatore o SET o.password=:password WHERE o.codiceop=:cod";
			Query q = manager.createQuery(s);
			q.setParameter("password", password);
			q.setParameter("cod", codVecchio);
			q.executeUpdate(); 
			
		}
		
		else {
			
			String s = "UPDATE operatore o SET o.codiceop=:codN SET o.password=:password WHERE o.codiceop=:codV";
			Query q = manager.createQuery(s);
			q.setParameter("codN", codNuovo);
			q.setParameter("codV", codVecchio);
			q.setParameter("password", password);   //eventualmente non è stata modificata
			q.executeUpdate(); 
			
			//nel db ho ON UPDATE CASCADE ---> basta modificare solo l'operatore
			
		}
		
		//Ritornare l'operatore con tutte le informazioni per poterlo visualizzare
		Operatore o = getOperatore(codNuovo);
		
		return o;
	}

	@Override
	public void elimina(String codice) {
		
		Operatore o = manager.find(Operatore.class, codice);
		
		manager.remove(o);  //ON DELETE SET NULL per il DB
		
	}
	
}
